package com.vcc.web.core.component;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectResult;
import com.vcc.core.exception.ProgramException;
import com.vcc.web.core.config.OssConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Date;

@Component
public class OssComponent {
    private static final Logger logger = LoggerFactory.getLogger(OssComponent.class);

    @Autowired
    private OssConfig ossConfig;

    public String uploadFile(File file, String fileName) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
        try {
            // 创建PutObject请求。
            PutObjectResult putObjectResult = ossClient.putObject(ossConfig.getBucketName(), fileName, file);
            return fileName;
        } catch (OSSException oe) {
            logger.error("上传文件OSS异常，异常信息为", oe);
            throw new ProgramException("上传失败");
        } catch (ClientException ce) {
            logger.error("上传文件Client异常，异常信息为", ce);
            throw new ProgramException("上传失败");
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    public URL generateTokenUrl(String fileName) {
        // 从STS服务获取临时访问凭证后，您可以通过临时访问密钥和安全令牌生成OSSClient。
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
        try {
            // 设置签名URL过期时间，单位为毫秒。
            Date expiration = new Date(new Date().getTime() + 3600 * 1000);
            // 生成以GET方法访问的签名URL，访客可以直接通过浏览器访问相关内容。
            return ossClient.generatePresignedUrl(ossConfig.getBucketName(), fileName, expiration);
        } catch (OSSException oe) {
            logger.error("获取信息OSS异常，异常信息为", oe);
            throw new ProgramException("获取信息失败");
        } catch (ClientException ce) {
            logger.error("获取信息Client异常，异常信息为", ce);
            throw new ProgramException("获取信息失败");
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    public Boolean remove(String fileName) {
        // 从STS服务获取临时访问凭证后，您可以通过临时访问密钥和安全令牌生成OSSClient。
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
        try {
            // 生成以GET方法访问的签名URL，访客可以直接通过浏览器访问相关内容。
            ossClient.deleteObject(ossConfig.getBucketName(), fileName);
            return true;
        } catch (OSSException oe) {
            logger.error("删除文件OSS异常，异常信息为", oe);
            throw new ProgramException("删除文件失败");
        } catch (ClientException ce) {
            logger.error("删除文件Client异常，异常信息为", ce);
            throw new ProgramException("删除文件失败");
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    public Boolean existsFile(String fileName){
        // 从STS服务获取临时访问凭证后，您可以通过临时访问密钥和安全令牌生成OSSClient。
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
        try {
            // 生成以GET方法访问的签名URL，访客可以直接通过浏览器访问相关内容。
            ossClient.doesObjectExist(ossConfig.getBucketName(), fileName);
            return true;
        } catch (OSSException oe) {
            logger.error("删除文件OSS异常，异常信息为", oe);
            throw new ProgramException("删除文件失败");
        } catch (ClientException ce) {
            logger.error("删除文件Client异常，异常信息为", ce);
            throw new ProgramException("删除文件失败");
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
